import {
    Toast
} from 'vant';
import axios from 'axios'
// import qs from 'qs'
import Router from '../router/index.js'
axios.defaults.timeout = 55000; //超时时间
// axios.defaults.retry = 3;                 //请求次数
// axios.defaults.retryDelay = 1000;         //请求间隙
let baseURL = process.env.VUE_APP_BASE_API
let loading = null

// 在config.js文件中统一存放一些公共常量，方便之后维护

// 添加请求拦截器，在发送请求之前做些什么(**具体查看axios文档**)--------------------------------------------
axios.interceptors.request.use(function (config) {
    loading = Toast.loading({
        // overlay: true,
        duration: 0,
        message: "加载中...",
        forbidClick: true,
        loadingType: "spinner"
    });
    config.headers["Content-Type"] = "application/json;charset=UTF-8";
    let token = localStorage.getItem("alcoholToken")
    if(token){
        config.headers['Authorization'] = "Bearer " + token
    }
    return config
}, function (error) {
    // 请求错误时弹框提示，或做些其他事

    return Promise.reject(error)
})

// 添加响应拦截器(**具体查看axios文档**)----------------------------------------------------------------
axios.interceptors.response.use(config=> {
    if (loading) {
        loading.clear()
    }
    // 对响应数据做点什么，允许在数据返回客户端前，修改响应的数据
    // 如果只需要返回体中数据，则如下，如果需要全部，则 return response 即可
    return config.data
}, function (error) {
    if (loading) {
        loading.clear()
    }
     // 断网 或者 请求超时 状态
    if (!error.response) {
      // 请求超时状态
        if (error.message.includes('timeout')) {
        console.log('超时了')
        Toast('请求超时，请检查网络是否连接正常')
        } else {
        // 可以展示断网组件
        console.log('断网了')
        Toast('请求失败，请检查网络是否已连接')
        }
        return
    }
    const responseCode = error.response.status
    if(responseCode){
        if(responseCode == 400){
            if (typeof error.response.data.title === 'string') {
                Toast(error.response.data.title)
            } else {
                Toast(error.response.data)
            }
        }else if(responseCode == 401){
            Toast("请登录")
            Router.push("/login")
        }else{
            Toast('服务器繁忙，请稍后再试')
        }
    }
    // 对响应错误做点什么
    return Promise.reject(error)
})

// 封装数据返回失败提示函数---------------------------------------------------------------------------
function errorState(response) {
    if (response) {
        // 请求超时
        if (response.error.message.includes('timeout')) {
            Toast('请求超时，请检查网络是否连接正常')
        } else {
            Toast('请求失败，请检查网络是否已连接')
        }
        return
    }
}

// 封装数据返回成功提示函数---------------------------------------------------------------------------
function successState(res) {
    // 隐藏loading
    // 统一判断后端返回的错误码(错误码与后台协商而定)
    if (res.errno === 400) {
        Toast(res.error.response.data.title)
        return res
    }
    if (res.code === 401) {
        Router.replace({
            path: '/login'
        })
        return
    }
}
// 封装axios--------------------------------------------------------------------------------------
export const apiAxios = (method, url, params = {}, isPing = false) => {
    let httpDefault = {
        method: method,
        baseURL: baseURL,
        url: url,
        // withCredentials: true,
        // `params` 是即将与请求一起发送的 URL 参数
        // `data` 是作为请求主体被发送的数据
    }
    if(isPing){
        httpDefault.url = url + params
    }else{
        if(method == 'get'){
            httpDefault.params = params
        }else{
            httpDefault.data = params
        }
    }
    // 注意**Promise**使用(Promise首字母大写)
    return new Promise((resolve, reject) => {
        axios(httpDefault)
            // 此处的.then属于axios
            .then((res) => {
                successState(res)
                resolve(res)
            }).catch((response) => {
                // Toast('网络请求失败，请稍后再试一下')
                // errorState(response)
                reject(response)
            })
    })
}
//form-data 图片上传
export const upAxios = (params = {}) => {
    Toast.loading({
        overlay: true,
        duration: 0,
        message: "上传中...",
        forbidClick: true,
        loadingType: "spinner"
    });
    let param = new FormData(); // 创建form对象
    params['access_token'] = '';
    params['access_token'] = localStorage.getItem("alcoholToken")
    param.append("type", params.type)
    param.append("token",  localStorage.getItem("alcoholToken"))
    param.append("file", params.file); // 通过append向form对象添加数据
    let httpDefault = {
        method: 'post',
        baseURL: baseURL,
        url: params.url,
        data: param
    }

    // 注意**Promise**使用(Promise首字母大写)
    return new Promise((resolve, reject) => {
        axios(httpDefault)
            // 此处的.then属于axios
            .then((res) => {
                successState(res)
                resolve(res)
                // Toast("上传完成")
                Toast.clear();
            }).catch((response) => {
                Toast('网络请求失败，请稍后再试一下')
                errorState(response)
                reject(response)
            })
    })
}
// 输出函数getAxios、postAxios、putAxios、delectAxios，供其他文件调用-----------------------------
// Vue.js的插件应当有一个公开方法 install。这个方法的第一个参数是 Vue 构造器，第二个参数是一个可选的选项对象。